package com.future;

/**
 * Description:
 * 给定一个字符串，你需要反转字符串中每个单词的字符顺序，同时仍保留空格和单词的初始顺序。
 * <p>
 * <p>
 * 示例：
 * <p>
 * 输入："Let's take LeetCode contest"
 * 输出："s'teL ekat edoCteeL tsetnoc"
 * <p>
 * 提示：
 * <p>
 * 在字符串中，每个单词由单个空格分隔，并且字符串中不会有任何额外的空格。
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/reverse-words-in-a-string-iii
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 *
 * @author weiruibai.vendor
 * Date: 2021/10/2 09:01
 */
public class Solution_reverseWords_557 {

    public static void main(String[] args) {
        String s = "Hello my name is weiruibai";
        s = "Let's take LeetCode contest";
        // s = "  Let's take LeetCode contest   ";
        //s = "AB  "; s'teL ekat edoCteeL tsetnoc
        s = "A  B  ";
        s = "I love u33";

        System.out.println("开始：" + s);
        System.out.println("答案：" + reverseWords_v1(s));
        System.out.println("结束：" + reverseWords_v2(s));

    }

    /**
     * @param s
     * @return
     */
    public static String reverseWords_v2(String s) {
        StringBuffer ret = new StringBuffer();
        int length = s.length();
        int i = 0;
        while (i < length) {
            int start = i;
            // 1、遍历找到一个单词
            while (i < length && s.charAt(i) != ' ') {
                i++;
            }
            // 2、把该单词倒叙遍历出来
            for (int p = i; p > start; p--) {
                char ss = s.charAt(p - 1);
                ret.append(ss);
            }
            // 3、拼接空格
            while (i < length && s.charAt(i) == ' ') {
                i++;
                ret.append(' ');
            }
        }
        return ret.toString();
    }

    /**
     * 改进(参考答案)
     *
     * @param s
     * @return
     */
    public static String reverseWords_v1(String s) {
        StringBuffer ret = new StringBuffer();
        int length = s.length();
        int i = 0;
        while (i < length) {
            int start = i;
            while (i < length && s.charAt(i) != ' ') {
                i++;
            }
            for (int p = start; p < i; p++) {
                char ss = s.charAt(start + i - 1 - p);
                ret.append(ss);
            }
            while (i < length && s.charAt(i) == ' ') {
                i++;
                ret.append(' ');
            }
        }
        return ret.toString();
    }

    /**
     * 只能不太好（自己做的）
     *
     * @param s
     * @return
     */
    public static String reverseWords(String s) {
        if (null == s || s.trim().length() == 0) {
            return s;
        }
        int length = s.length();
        int startIndex = 0;
        int endIndex;
        boolean word = false;
        for (int i = 0; i < length; i++) {
            char c = s.charAt(i);
            if ((i == 0 || s.charAt(i - 1) == ' ') && c != ' ') {
                // 一个单词的开始
                word = true;
                startIndex = i;
            } else if (word) {
                // 一个单词的结束
                endIndex = i;
                if (i > 0 && s.charAt(i - 1) != ' ' && c == ' ') {
                    word = false;
                    // 此时endIndex位置为单词的后一个空格，需要减1
                    s = reverse(s, startIndex, endIndex - 1);
                } else if (i == s.length() - 1) {
                    // 此时endIndex位置为单词的后一个字符
                    s = reverse(s, startIndex, endIndex);
                }
            }
        }
        return s;
    }

    private static String reverse(String s, int start, int end) {
        if (start >= end) {
            return s;
        }
        char[] chars = s.toCharArray();
        while (start < end) {
            char c = chars[start];
            chars[start] = chars[end];
            chars[end] = c;
            start++;
            end--;
        }
        return String.valueOf(chars);
    }

}
